package org.hyou.demos.msg.seri.msg;

import org.msgpack.annotation.Message;

/**
 * <pre>
 * 消息头.
 * 参考《驾培计时终端通讯协议（立宇泰电子_锐嵌科技）(v0.6).pdf》
 * 
 * |---------|-------------|---------|----------------------------------------------------------------
 * |.起始字节.| .字段.      |.数据类型.|.描述及要求.
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 0       | .协议版本号. | BYTE    | 协议标准的版本号，具体定义如下：
 * |         |             |         |  0：JT/T 808-2011；
 * |         |             |         |  1：北斗兼容车载终端通讯协议技术规范-2013；
 * |         |             |         |  128：机动车驾驶员计时培训系统平台技术规范-2016；（默认取这个值）
 * |         |             |         |  224-255：自定义；
 * |         |             |         |  其他保留
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 1       | .消息 ID.    | WORD    | 根据下文中每个消息的说明来填写ID。
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 3       | .消息体属性. | WORD    | 消息体属性格式结构图见表 B.4
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 5       | .终端手机号. | BCD[8]  | 根据安装后终端自身的手机号转换。
 * |         |             |         | 手机号不足 16 位，则在前补充数字，
 * |         |             |         | 大陆手机号补充数字0 港澳台则根据其区号进行位数补充。
 * |         |             |         | （指终端SIM卡的手机号码。在多台终端的场合下，必须是唯一的，用来区别是哪一台终端发送的数据包）
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 13      | .消息流水号. | WORD    | 按发送顺序从 0 开始循环累加
 * |---------|-------------|---------|----------------------------------------------------------------
 * | 15      | .预留.       | BYTE    | 预留
 * |---------|--------------|---------|---------------------------------------------------------------
 * | 16      | .消息包封装项. |         | 如果消息体属性中相关标识位确定消息分包处理，则该项有内容，否则无该项
 * |---------|--------------|----------|--------------------------------------------------------------
 * 
 * 消息体属性格式结构 :
 * |----|----|----|----|----|----|---|---|---|---|---|---|---|---|---|---|
 * | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
 * |----|----|----|----|----|----|---|---|---|---|---|---|---|---|---|---|
 * | 保留.   |分包.| 数据加密方式.| 消息体长度.                            |
 * |---------|----|--------------|---------------------------------------|
 * 
 * 
 * 消息包封装项内容 : 
 * |---------|-------------|----------|---------------------|
 * |.起始字节.| .字段.      |.数据类型.|.描述及要求.          | 
 * |---------|-------------|----------|---------------------|
 * | 0       | .消息总包数. | WORD    | 该消息分包后的总包数. |
 * |---------|-------------|----------|---------------------|
 * | 2       | .包序号.     | WORD    | 从1开始.             |
 * |---------|-------------|----------|---------------------|
 * 
 * </pre>
 * 
 * @author FengChangshuo
 * @version 1.0.0 2017年1月19日 上午11:21:36 created
 */
@Message
public class Header extends BaseBean {
    
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = -4421572118801911651L;
    
    /**
     * <pre>
     * 协议版本号 (BYTE)
     * 
     * 协议标准的版本号，具体定义如下：
     * 0：JT/T 808-2011；
     * 1：北斗兼容车载终端通讯协议技术规范-2013；
     * 128：机动车驾驶员计时培训系统平台技术规范-2016；（默认取这个值）
     * 224-255：自定义；
     * 其他保留
     * </pre>
     */
    private int version;
    
    /**
     * 消息ID (WORD)
     */
    private int msgCmdId;
    
    /**
     * <pre>
     * 消息体属性-是否分包 : 0:不分包 1:分包
     * 当消息体属性中第13位为1时表示消息体为长消息，进行分包发送处理，具体分包信息由消息包封装项决定；
     * 若第13位为0，则消息头中无消息包封装项字段。
     * </pre>
     */
    private int isPackage;
    
    /**
     * 消息体属性-是否加密. 1-表示消息体经过RSA算法加密. 0-表示不加密
     */
    private int encryptionType;
    
    /**
     * 消息体属性-消息体长度
     */
    private int msgLength;
    
    /**
     * 终端手机号
     */
    private String mobile;
    
    /**
     * 消息流水号 WORD
     */
    private int serialId;
    
    /**
     * 预留 BYTE
     */
    private int reserved;
    
    /**
     * 消息分包后的总包数 WORD
     */
    private int packTotal;
    
    /**
     * 消息分包序号
     */
    private int packNum;
    
    /**
     * 消息头字节数
     */
    private int headerLength;
    
    /**
     * <pre>
     * 0：JT/T 808-2011；
     * 1：北斗兼容车载终端通讯协议技术规范-2013；
     * 128：机动车驾驶员计时培训系统平台技术规范-2016；（默认取这个值）
     * 224-255：自定义；
     * 其他保留
     * </pre>
     * 
     * @return 协议标准的版本号
     */
    public int getVersion() {
        return version;
    }
    
    /**
     * <pre>
     * 0：JT/T 808-2011；
     * 1：北斗兼容车载终端通讯协议技术规范-2013；
     * 128：机动车驾驶员计时培训系统平台技术规范-2016；（默认取这个值）
     * 224-255：自定义；
     * 其他保留
     * </pre>
     * 
     * @param version 协议标准的版本号
     */
    public void setVersion(int version) {
        this.version = version;
    }
    
    /**
     * @return 消息ID
     */
    public int getMsgCmdId() {
        return msgCmdId;
    }
    
    /**
     * @param msgCmdId 消息ID
     */
    public void setMsgCmdId(int msgCmdId) {
        this.msgCmdId = msgCmdId;
    }
    
    /**
     * @return 消息体属性-消息体长度
     */
    public int getMsgLength() {
        return msgLength;
    }
    
    /**
     * @param msgLength 消息体属性-消息体长度
     */
    public void setMsgLength(int msgLength) {
        this.msgLength = msgLength;
    }
    
    /**
     * @return 消息体属性-是否分包 : 0:不分包 1:分包
     */
    public int getIsPackage() {
        return isPackage;
    }
    
    /**
     * @param isPackage 消息体属性-是否分包 : 0:不分包 1:分包
     */
    public void setIsPackage(int isPackage) {
        this.isPackage = isPackage;
    }
    
    /**
     * @return 消息流水号
     */
    public int getSerialId() {
        return serialId;
    }
    
    /**
     * @param serialId 消息流水号
     */
    public void setSerialId(int serialId) {
        this.serialId = serialId;
    }
    
    /**
     * @return 预留
     */
    public int getReserved() {
        return reserved;
    }
    
    /**
     * @param reserved 预留
     */
    public void setReserved(int reserved) {
        this.reserved = reserved;
    }
    
    /**
     * @return 消息分包后的总包数
     */
    public int getPackTotal() {
        return packTotal;
    }
    
    /**
     * @param packTotal 消息分包后的总包数
     */
    public void setPackTotal(int packTotal) {
        this.packTotal = packTotal;
    }
    
    /**
     * @return 消息分包序号
     */
    public int getPackNum() {
        return packNum;
    }
    
    /**
     * @param packNum 消息分包序号
     */
    public void setPackNum(int packNum) {
        this.packNum = packNum;
    }
    
    /**
     * @return 消息体属性-是否加密. 1-表示消息体经过RSA算法加密. 0-表示不加密
     */
    public int getEncryptionType() {
        return encryptionType;
    }
    
    /**
     * @param encryptionType 消息体属性-是否加密. 1-表示消息体经过RSA算法加密. 0-表示不加密
     */
    public void setEncryptionType(int encryptionType) {
        this.encryptionType = encryptionType;
    }
    
    /**
     * @return 终端手机号
     */
    public String getMobile() {
        return mobile;
    }
    
    /**
     * @param mobile 终端手机号
     */
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    
    /**
     * @return 消息头字节数
     */
    public int getHeaderLength() {
        return this.headerLength;
    }
    
    /**
     * @param headerLength 消息头字节数
     */
    public void setHeaderLength(int headerLength) {
        this.headerLength = headerLength;
    }
    
    /***
     * @return 获取消息唯一标识. 格式：终端手机号_消息ID
     */
    public String getMessageKey() {
        return this.mobile + ":" + this.msgCmdId;
    }
}
